package com.gayworld.model.dao;

import java.io.Serializable;
import java.util.Collections;
import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;  

/**
 * Clase abstracta en donde colocamos los metodos comunes de los DAOs.
 * @author David
 *
 * @param <T>
 */
public abstract class HibernateBaseDAO<T> implements BaseDAO<T> {
 
	@Autowired
	private SessionFactory sessionFactory;
 
	 
	
	/**
	 * Metodo que obliga a guardar en base de datos todo lo que hay en el contexto.
	 */
	public void flush() {
		sessionFactory.getCurrentSession().flush();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<T> findAll(Class<T> type) {
		String queryString = "from " + type.getCanonicalName() + " model"; 	 
		
		return Collections.checkedList(sessionFactory.getCurrentSession().createQuery(queryString)
				.setMaxResults(5).list(), type);
	}

	@SuppressWarnings("unchecked")
	@Override
	public T findById(Class<T> type, Serializable id) {		
		return (T) sessionFactory.getCurrentSession().get(type.getCanonicalName(), id);
	}

	@Override
	public Serializable save(T modelObject) {
		return sessionFactory.getCurrentSession().save(modelObject);
	}

	@Override
	public void update(T modelObject) {
		sessionFactory.getCurrentSession().update(modelObject);
	}

	@Override
	public void delete(T modelObject) {
		sessionFactory.getCurrentSession().delete(modelObject);
	}
	
	@Override
	public SessionFactory getSession() {
		return  sessionFactory;
	}
}
